#include <REGX52.H>
/**
 * 灯一开始是常亮状态
 * 按一下变为闪烁。
 * 按一下熄灭。
 * 按一下常亮。
 * 三个状态切换
 *
 */
sbit  led = P3^1;
sbit button = P3^7;
unsigned char state = 0;  // 状态变量：0-常亮，1-闪烁，2-熄灭
unsigned char press_flag = 0;  // 按键按下标志

void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 123; j++)
            ;
    }
}

void main() {
    while (1) {
        if (button == 0) {          // 检测按键是否按下
            delay_ms(10);           // 延时去抖动
            if (button == 0 && press_flag == 0) {
                press_flag = 1;     // 设置按键已按下标志
                state = (state + 1) % 3;  // 切换状态（0 -> 1 -> 2 -> 0）
            }
        } else {
            press_flag = 0;         // 按键释放后清空标志
        }

        switch (state) {
            case 0:                 // 常亮
                led = 1;            // LED亮
                break;
            case 1:                 // 闪烁
                led = ~led;         // LED取反（亮/灭交替）
                delay_ms(200);      // 延时500ms
                break;
            case 2:                 // 熄灭
                led = 0;            // LED灭
                break;
        }
    }
}
